package uniandes.cupi2.photoViewer.mundo;

import java.util.ArrayList;
import java.util.Date;

import uniandes.cupi2.photoViewer.listas.IListaAlbum;
import uniandes.cupi2.photoViewer.listas.IListaFoto;

public class ListaAlbum implements IListaAlbum<Album>
{
   /**
    * Es el primer album
    */

	
	public final static String ASCENDENTE = "Ascendentemente";
	public final static String DESCENDENTE = "Descendentemente";


	private Album primerElemento;
	/**
	 * Es el ultimo album
	 */
	private Album ultimoElemento;
	/**
	 * Es el siguiente album
	 */
	private Album siguiente;
	/**
	 * Es la longitud de la lista 
	 */
	private Album anterior;
	
	private int longitud;
	

	/**
	 * Es la lista de fotos
	 */

	private Album actual;
	

	private IListaFoto fotos; 
	//Constructor
	/**
	 * Construye la lista de albumes del photoviewer
	 */
	private String ordenActual;
	

	public ListaAlbum( )
	{
		ordenActual = ASCENDENTE;
		longitud=0;
	}
	/**
	 * Da el siguiente album
	 * @return
	 */

	public Album darSiguiente()
	{
		return siguiente;
	}
	/**
	 * Cambia el siguiente
	 * @param nuevo
	 */
	public void cambiarSiguiente(Album nuevo)
	{
		siguiente=nuevo;
	}
	
	/**
	 * Adiciona un album 
	 */
	public boolean adicionar(Album aAgregar)
	{
		boolean respuesta=false;
		if( primerElemento == null )
		{
            primerElemento = aAgregar;
            ultimoElemento = aAgregar;
            longitud++;
            respuesta = true;
		}
        else if( primerElemento.getNombre().compareTo( aAgregar.getNombre() ) > 0 )
        {
            primerElemento.insertarAntes( aAgregar );
            primerElemento = aAgregar;
            longitud++;
            respuesta = true;
        }
        else
        {
            Album actualTemp0 = null;
            Album actualTemp1 = primerElemento;
            while( actualTemp1 != null && actualTemp1.getNombre().compareTo( aAgregar.getNombre() ) > 0 )
            {
            	actualTemp0 = actualTemp1;
                actualTemp1 = actualTemp1.darSiguiente( );
            }
            actualTemp0.insertarDespues( aAgregar );
            longitud++;
            respuesta = true;
        }
		return respuesta;
	}

	/**
	 * Elimina un album 
	 */
	public boolean eliminar(String aEliminar)
	{
		boolean respuesta=false;
		if (primerElemento.getNombre( ).equals( aEliminar ) && longitud == 1)
		{
			longitud = 0;
			respuesta = true;
			primerElemento = null;
			ultimoElemento = null;
		}
		else if (primerElemento.getNombre( ).equals(aEliminar) && longitud >= 1)
		{
			primerElemento=primerElemento.darSiguiente();
			longitud--;
			respuesta=true;
		}
		else 
		{
			Album actual=primerElemento;
			boolean eliminado=false;
			while( actual.darSiguiente() != null && eliminado)
			{
				if( actual.darSiguiente().getNombre().equals(aEliminar) && actual.darSiguiente() != ultimoElemento )
				{
					Album actualTemp= actual.darSiguiente();
					actual.cambiarSiguiente(actualTemp.darSiguiente());
					eliminado=true;
				}
				else if (actual.darSiguiente().getNombre().equals(aEliminar) && actual.darSiguiente() == ultimoElemento)
				{
					ultimoElemento = actual;
					ultimoElemento.cambiarSiguiente(null);
				}
				else
				{
					actual = actual.darSiguiente();
				}
			}
			longitud--;
		}
		return respuesta;
	}
	/**
	 * Da la longitud de la lista
	 * @return
	 */
	public int darLongitud()
	{
		return longitud;
	}
	
	public IListaFoto<Foto> darFotos()
	{
		return fotos;
	}

	/**
	 * Ordena los elementos dependiendo del tipo de ordenamiento que entra por parametro
	 */
	public void ordenar(String tipoOrdenamiento)

	{
		while (primerElemento != null && primerElemento.darSiguiente() != null) 
		{

			if (tipoOrdenamiento.equalsIgnoreCase(ASCENDENTE))
			{
				if(ordenActual.equals(DESCENDENTE))
				{
					Album primeroTemp = ultimoElemento;
					Album actual = primeroTemp;
					while( actual != null )
					{
						Album temp = actual.darSiguiente();
						actual.cambiarSiguiente(primeroTemp.darAnterior());
						actual.cambiarAnterior(temp);
					}
				}
			}
			if (tipoOrdenamiento.equalsIgnoreCase(DESCENDENTE))
			{
				if(ordenActual.equals(ASCENDENTE))
				{
					Album primeroTemp = ultimoElemento;
					Album actual = primeroTemp;
					while( actual != null )
					{
						Album temp = actual.darSiguiente();
						actual.cambiarSiguiente(primeroTemp.darAnterior());
						actual.cambiarAnterior(temp);
					}
				}
			}

		}
		
	}
	
	public Album localizarAnterior(Album anterior) 
	{
		Album actual = primerElemento;

		while (actual != null) {
			anterior = actual;
			actual = actual.darSiguiente();
		}

		return actual != null ? anterior : null;
	}

	public void cambiarAnterior(Album actual, Album anterior)
	{
		actual = primerElemento;
		anterior = null;

		while (actual != null) {

			Album x = localizarAnterior(actual);
			x = anterior;

		}
	}
	/**
	 *Busca un album dependiendo del nombre de la etiqueta que entra por parametro 
	 *@param nEtiqueta. Es el nombre de la etiqueta a buscar
	 */
	public Album buscarAlbumPorEtiqueta(String nEtiqueta)
	{
		Album buscado = null;
		Album actual = primerElemento;
		if( longitud >= 1 && primerElemento.existeEtiqueta(nEtiqueta))
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.existeEtiqueta(nEtiqueta) )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.existeEtiqueta(nEtiqueta) )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.existeEtiqueta(nEtiqueta) )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;
	}
	
	public Album buscarAlbumPorNombreDeFoto(String nombreFoto)
	{
		
		Album buscado = null;
		Album actual = primerElemento;
		if( longitud >= 1 && primerElemento.existeFoto(nombreFoto) )
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.existeFoto(nombreFoto) )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.existeFoto(nombreFoto) )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.existeFoto(nombreFoto) )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;

	}

	@Override
	public Album buscarAlbumPorFecha(Date fecha)
	{
		Album buscado = null;
		Album actual = primerElemento;
		if( longitud >= 1 && primerElemento.getFecha() == fecha )
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.getFecha() == fecha )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.getFecha() == fecha )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.getFecha() == fecha )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;
	}

	@Override
	public boolean eliminarAlbum(Album eliminado)
	{
		boolean elimino = false;
		return elimino;
	}

	@Override
	public boolean agregarEtiquetaAlbum(String nEtiqueta)
	{
		boolean agrego = false;
		return agrego;
	}

	@Override
	public boolean eliminarEtiquetaAlbum(String nEtiqueta)
	{
		boolean elimino = false;
		// TODO Auto-generated method stub
		return elimino;
	}
    /**
     * Busca un album dependiendo del nombre que entra por parametro
     * @param nombreAlbum. nombreAlbum es el nombre del album a buscar
     */

	public Album buscarPorNombre( String nombreAlbum )
	{
		Album buscado = null;
		Album actual = primerElemento;
		if( longitud >= 1 && primerElemento.getNombre( ).equals( nombreAlbum ))
		{
			buscado = primerElemento;
		}
		else if( longitud == 2 )
		{
			if( primerElemento.getNombre().equals(nombreAlbum) )
			{
				buscado=primerElemento;
			}
			if( ultimoElemento.getNombre().equals(nombreAlbum) )
			{
				buscado=ultimoElemento;
			}
		}
		else 
		{
			if( actual != null )
			{
				boolean encontrado = false;
				while( actual.darSiguiente( ) != null && !encontrado )
				{
					if( actual.getNombre().equals(nombreAlbum) )
					{
						encontrado = true;
						buscado=actual;
					}
					actual = actual.darSiguiente( );
				}
			}
		}
		return buscado;
	}
	
	public String[ ] toArray( )
	{
		String[ ] resultado= new String[ longitud ];
		Album actual = primerElemento;
		int posicion = 0;
		while( actual != null )
		{
			resultado[ posicion ] = actual.getNombre( );
			posicion++;
			actual = actual.darSiguiente();
		}
		return resultado;
	}

}
